﻿using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using KamLib;


namespace Ext.Net.UIS
{

    public enum FieldBoxKind
    {
        Form,
        Grid
    };

    /// <summary>
    /// Виртуальный контейнер для ui-controls для полей.
    /// Замещает себя реальными компонентами на основании бизнес-модели. Она привязывается через свойство Name.
    /// Обязательно включать в EntityBox с IsRoot=true.
    /// Можно присваивать свойства, присущие Ext.Net.Term - они скопируются каждому реальному компоненту.
    /// </summary>
    public class FieldBox : Ext.Net.Field, ITermBox
    {

        #region Constructors

        public FieldBox() : base() { }
        public FieldBox(string name) : base() { Name = name; }
        public FieldBox(string name, string editorName) : base() { Name = name; EditorName = editorName; }

        #endregion

        public new Context Context { get; set; }
        /// <summary>
        /// Указываются names зарегистрированных Fields в формате:
        /// Field1 + 'label' + Field2; Field3; Field4, Field5 
        /// Разделители:
        /// '+' - в одну строчку без titles;
        /// ',' - в одну строчку;
        /// ';' - с новой строки.
        /// </summary>
        public new string Name { get; set; }
        public Term Term { get; set; }
        public string EditorName { get; set; }
        public FieldBoxKind Kind;

        public TermNode ParentTermNode { get; set; }
        public TermNode TermNode { get; set; }


        #region Быстрые свойства

        public string Title { get { return FieldLabel; } set { FieldLabel = value; } }

        #endregion

        public override string ToString()
        {
            return "FieldBox " + TermNode.GetPathName() + Name;
        }


        #region Controls

        public bool ControlsCreated { get; set; }
        /// <summary>
        /// Вызывается в EntityBox для замещения себя реальными компонентами
        /// </summary>
        /// <returns></returns>
        void ITermBox.CreateControls(UisCreateControlArgs e)
        {
            var container = ParentComponent as AbstractContainer;
            if (container == null) return;

            if (Term == null && Name.yes())
                Term = Term.Get(Name, ParentTermNode);

            if (Term == null) return;

            TermNode =
                Kind == FieldBoxKind.Grid ? TermNodeFactory.NewGridNode(Context, ParentTermNode, Term) :
                TermNodeFactory.NewFormNode(Context, ParentTermNode, Term);

            var list = NewControls();
            var i = container.Items.IndexOf(this);
            if (i >= 0)
                container.Items.InsertRange(i + 1, list);
            else
                container.Items.AddRange(list);
        }

        /// <summary>
        /// Создаёт реальные компоненты на основе указанных полей.
        /// </summary>
        /// <returns></returns>
        protected virtual List<AbstractComponent> NewControls()
        {
            if (EditorName.yes())
                TermNode.Editor = TermEditor.FormGet(EditorName);

            var e = new UisCreateControlArgs(Context)
            {
                BaseViewState = ViewState
            };
            var list = TermNode.NewControls(e).ToList();
            return list;
        }

        #endregion


        #region Для уменьшения генерируемого javascript

        [DefaultValue(false)]
        public override bool Visible { get { return false; } set { } }
        protected override void OnClientInit(bool reinit) { }

        #endregion
    }





}